
#include "nane/CodecSystem/Image/ImageDecoder.h"
#include "nane/CodecSystem/Image/ImageDecoderImpl_.h"
#include "nane/CodecSystem/Image/ImageCodecSystemImpl_.h"

#include "nane/core/assert.h"

namespace nane 
{
    ////////////////////////////////////////////////////////////////////////////////////////////////
    ImageDecoder::ImageDecoder( const NullType& )
        : SubSystemProduct()
        , m( NULL )
    {
    }
    ////////////////////////////////////////////////////////////////////////////////////////////////
    ImageDecoder::ImageDecoder( Implementation* _impl )
        : SubSystemProduct( _impl )
        , m( _impl )
    {
    }
    ////////////////////////////////////////////////////////////////////////////////////////////////
    ImageDecoder::ImageDecoder( const ImageDecoder& _other )
        : SubSystemProduct( _other )
        , m( _other.m )
    {
    }
    ////////////////////////////////////////////////////////////////////////////////////////////////
    uint32 ImageDecoder::GetWidth()
    {
        NANE_ASSERT_RV( m != NULL, "ImageDecoder must be valid", 0 );
        return m->interface->GetWidth();
    }
    ////////////////////////////////////////////////////////////////////////////////////////////////
    uint32 ImageDecoder::GetHeight()
    {
        NANE_ASSERT_RV( m != NULL, "ImageDecoder must be valid", 0 );
        return m->interface->GetHeight();
    }
    ////////////////////////////////////////////////////////////////////////////////////////////////
    EPixelFormat ImageDecoder::GetFormat()
    {
        NANE_ASSERT_RV( m != NULL, "ImageDecoder must be valid", EPixelFormat::Unknown );
        return enum_cast<EPixelFormat>(m->interface->GetFormat());
    }
    ////////////////////////////////////////////////////////////////////////////////////////////////
    uint32 ImageDecoder::ReadRow( byte* _buffer, uint32 _count )
    {
        NANE_ASSERT_RV( m != NULL, "ImageDecoder must be valid", 0 );
        NANE_ASSERT_RV( _buffer != NULL, "buffer must be valid", 0 );
        return m->interface->Read(_buffer, _count);
    }
    ////////////////////////////////////////////////////////////////////////////////////////////////
}   // namespace nane
